//package org.zbclan.bf2.rcon.service;
//
//import java.io.IOException;
//import java.io.Serializable;
//import java.util.Observable;
//import java.util.Observer;
//
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.zbclan.bf2.rcon.ResourceCleaner;
//
//import com.rabbitmq.client.AMQP;
//import com.rabbitmq.client.Channel;
//import com.rabbitmq.client.Connection;
//import com.rabbitmq.client.ConnectionFactory;
//import com.rabbitmq.client.GetResponse;
//import com.rabbitmq.client.QueueingConsumer;
//
//public class MessageQueueServiceRabbitImpl implements MessageQueueService,
//		Serializable {
//
//	/**
//	 * 
//	 */
//	private static final long serialVersionUID = -9203236769028124181L;
//
//	private static final Logger logger = LoggerFactory
//			.getLogger(MessageQueueServiceRabbitImpl.class);
//
//	/*-
//	 * http://www.rabbitmq.com/faq.html#how-many-concurrent-connections
//	 */
//	private static Connection connection;
//
//	/*-
//	 * http://www.rabbitmq.com/api-guide.html#channel-threads
//	 */
//	private static ThreadLocal<Channel> channel = new ThreadLocal<Channel>();
//
//	// @Inject
//	// @Named(AccountsModule.QUEUE_SERVER_HOST)
//	private String host;
//
//	public MessageQueueServiceRabbitImpl(String host) {
//		this.host = host;
//	}
//
//	private Channel getChannel() throws IOException {
//
//		Channel c = channel.get();
//		if (c == null) {
//
//			if (connection == null) {
//				synchronized (MessageQueueService.CONNECTION_SYNC) {
//					if (connection == null) {
//						ConnectionFactory factory = new ConnectionFactory();
//						factory.setHost(host);
//						connection = factory.newConnection();
//						ResourceCleaner.addObserver(new Observer() {
//
//							public void update(Observable o, Object arg) {
//
//								try {
//									connection.close();
//								} catch (IOException ex) {
//									String msg = "failed to close activemq connection";
//									logger.error(msg, ex);
//								}
//
//								return;
//							}
//						});
//					}
//				}
//			}
//
//			c = connection.createChannel();
//
//			channel.set(c);
//		}
//
//		return c;
//	}
//
//	public void send(String queue, String message) throws MessageQueueException {
//
//		/*
//		 * send to mq
//		 */
//		try {
//			Channel channel = getChannel();
//
//			// boolean durable = false;
//			// boolean exclusive = false;
//			// boolean autoDelete = false;
//			// Map<String, Object> arguments = null;
//			// channel.queueDeclare(queue, durable, exclusive, autoDelete,
//			// arguments);
//
//			/*
//			 * Nameless Exchange
//			 */
//			String exchange = "";
//			String routingKey = queue;
//			AMQP.BasicProperties props = null;
//			channel.basicPublish(exchange, routingKey, props,
//					message.getBytes());
//
//		} catch (Exception ex) {
//			throw new MessageQueueException(ex);
//		}
//
//		return;
//	}
//
//	public String fetch(String queue) throws MessageQueueException {
//
//		String message;
//
//		try {
//			Channel channel = getChannel();
//			GetResponse response = channel.basicGet(queue, false);
//			if (response != null) {
//				message = new String(response.getBody());
//				channel.basicAck(response.getEnvelope().getDeliveryTag(), false);
//			} else {
//				message = null;
//			}
//		} catch (Exception ex) {
//			throw new MessageQueueException(ex);
//		}
//
//		return message;
//	}
//
//	public String receive(String queue) throws MessageQueueException {
//
//		String message;
//
//		try {
//			Channel channel = getChannel();
//			channel.queueDeclare(queue, false, false, false, null);
//
//			QueueingConsumer consumer = new QueueingConsumer(channel);
//			channel.basicConsume(queue, false, consumer);
//
//			QueueingConsumer.Delivery delivery = consumer.nextDelivery();
//
//			message = new String(delivery.getBody());
//			logger.trace(message);
//
//			channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
//
//		} catch (Exception ex) {
//			throw new MessageQueueException(ex);
//		}
//
//		return message;
//	}
//}
